#ifndef BOARD_H
#define BOARD_H

#include <http.h>
#include <web_socket.h>
#include <mqtt.h>
#include <udp.h>
#include <string>

#include "led/led.h"
#include "backlight.h"

/**
 * @brief 创建开发板实例的函数声明
 * 
 * @return void* 返回开发板实例的指针
 */
void* create_board();

// 前向声明
class AudioCodec;
class Display;

/**
 * @brief 开发板基类
 * 
 * 定义了所有开发板共有的接口和基本功能
 */
class Board {
private:
    Board(const Board&) = delete; // 禁用拷贝构造函数
    Board& operator=(const Board&) = delete; // 禁用赋值操作
    
    /**
     * @brief 获取开发板JSON配置信息
     * 
     * @return std::string 包含开发板配置的JSON字符串
     */
    virtual std::string GetBoardJson() = 0;

protected:
    /**
     * @brief 开发板基类构造函数
     */
    Board();
    
    /**
     * @brief 生成设备唯一标识UUID
     * 
     * @return std::string 生成的UUID字符串
     */
    std::string GenerateUuid();

    // 软件生成的设备唯一标识
    std::string uuid_;

public:
    /**
     * @brief 获取开发板单例实例
     * 
     * @return Board& 开发板实例的引用
     */
    static Board& GetInstance() {
        static Board* instance = static_cast<Board*>(create_board());
        return *instance;
    }

    /**
     * @brief 虚析构函数
     */
    virtual ~Board() = default;
    
    /**
     * @brief 获取开发板类型
     * 
     * @return std::string 开发板类型标识符
     */
    virtual std::string GetBoardType() = 0;
    
    /**
     * @brief 获取设备UUID
     * 
     * @return std::string 设备唯一标识
     */
    virtual std::string GetUuid() { return uuid_; }
    
    /**
     * @brief 获取背光控制器
     * 
     * @return Backlight* 背光控制器指针，默认为nullptr
     */
    virtual Backlight* GetBacklight() { return nullptr; }
    
    /**
     * @brief 获取LED控制器
     * 
     * @return Led* LED控制器指针
     */
    virtual Led* GetLed();
    
    /**
     * @brief 获取音频编解码器
     * 
     * @return AudioCodec* 音频编解码器指针
     */
    virtual AudioCodec* GetAudioCodec() = 0;
    
    /**
     * @brief 获取显示器
     * 
     * @return Display* 显示器指针
     */
    virtual Display* GetDisplay();
    
    /**
     * @brief 创建HTTP客户端
     * 
     * @return Http* HTTP客户端指针
     */
    virtual Http* CreateHttp() = 0;
    
    /**
     * @brief 创建WebSocket客户端
     * 
     * @return WebSocket* WebSocket客户端指针
     */
    virtual WebSocket* CreateWebSocket() = 0;
    
    /**
     * @brief 创建MQTT客户端
     * 
     * @return Mqtt* MQTT客户端指针
     */
    virtual Mqtt* CreateMqtt() = 0;
    
    /**
     * @brief 创建UDP客户端
     * 
     * @return Udp* UDP客户端指针
     */
    virtual Udp* CreateUdp() = 0;
    
    /**
     * @brief 启动网络连接
     */
    virtual void StartNetwork() = 0;
    
    /**
     * @brief 获取网络状态图标
     * 
     * @return const char* 表示当前网络状态的图标字符串
     */
    virtual const char* GetNetworkStateIcon() = 0;
    
    /**
     * @brief 获取电池电量信息
     * 
     * @param level 输出参数，电池电量百分比
     * @param charging 输出参数，是否正在充电
     * @param discharging 输出参数，是否正在放电
     * @return bool 是否成功获取电池信息
     */
    virtual bool GetBatteryLevel(int &level, bool& charging, bool& discharging);
    
    /**
     * @brief 获取开发板JSON信息
     * 
     * @return std::string 包含开发板信息的JSON字符串
     */
    virtual std::string GetJson();
    
    /**
     * @brief 设置电源节能模式
     * 
     * @param enabled true启用节能模式，false禁用节能模式
     */
    virtual void SetPowerSaveMode(bool enabled) = 0;
};

/**
 * @brief 声明开发板类的宏
 * 
 * 用于在具体开发板实现中创建开发板实例
 * 
 * @param BOARD_CLASS_NAME 开发板类名
 */
#define DECLARE_BOARD(BOARD_CLASS_NAME) \
void* create_board() { \
    return new BOARD_CLASS_NAME(); \
}

#endif // BOARD_H
